package com.ecommerce.common.result;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
 * 统一响应结果封装类
 * 用于前端友好的接口响应格式
 * 
 * @param <T> 数据类型
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "统一响应结果")
public class Result<T> {
    
    /**
     * 响应码
     */
    @ApiModelProperty(value = "响应码", example = "200")
    private Integer code;
    
    /**
     * 响应消息
     */
    @ApiModelProperty(value = "响应消息", example = "操作成功")
    private String message;
    
    /**
     * 响应数据
     */
    @ApiModelProperty(value = "响应数据")
    private T data;
    
    /**
     * 时间戳
     */
    @ApiModelProperty(value = "时间戳", example = "1640995200000")
    private Long timestamp;
    
    /**
     * 是否成功
     */
    @ApiModelProperty(value = "是否成功", example = "true")
    private Boolean success;
    
    // 响应码常量
    public static final int SUCCESS_CODE = 200;
    public static final int ERROR_CODE = 500;
    public static final int PARAM_ERROR_CODE = 400;
    public static final int UNAUTHORIZED_CODE = 401;
    public static final int FORBIDDEN_CODE = 403;
    public static final int NOT_FOUND_CODE = 404;
    
    /**
     * 成功响应（无数据）
     */
    public static <T> Result<T> success() {
        return success("操作成功", null);
    }
    
    /**
     * 成功响应（带消息）
     */
    public static <T> Result<T> success(String message) {
        return success(message, null);
    }
    
    /**
     * 成功响应（带数据）
     */
    public static <T> Result<T> success(T data) {
        return success("操作成功", data);
    }
    
    /**
     * 成功响应（带消息和数据）
     */
    public static <T> Result<T> success(String message, T data) {
        return new Result<>(SUCCESS_CODE, message, data, System.currentTimeMillis(), true);
    }
    
    /**
     * 失败响应（默认消息）
     */
    public static <T> Result<T> error() {
        return error("操作失败");
    }
    
    /**
     * 失败响应（带消息）
     */
    public static <T> Result<T> error(String message) {
        return error(ERROR_CODE, message, null);
    }
    
    /**
     * 失败响应（带消息和数据）
     */
    public static <T> Result<T> error(String message, T data) {
        return error(ERROR_CODE, message, data);
    }
    
    /**
     * 失败响应（带状态码和消息）
     */
    public static <T> Result<T> error(Integer code, String message) {
        return error(code, message, null);
    }
    
    /**
     * 失败响应（完整参数）
     */
    public static <T> Result<T> error(Integer code, String message, T data) {
        return new Result<>(code, message, data, System.currentTimeMillis(), false);
    }
    
    /**
     * 参数错误响应
     */
    public static <T> Result<T> paramError(String message) {
        return error(PARAM_ERROR_CODE, message);
    }
    
    /**
     * 未授权响应
     */
    public static <T> Result<T> unauthorized(String message) {
        return error(UNAUTHORIZED_CODE, message != null ? message : "未授权访问");
    }
    
    /**
     * 禁止访问响应
     */
    public static <T> Result<T> forbidden(String message) {
        return error(FORBIDDEN_CODE, message != null ? message : "禁止访问");
    }
    
    /**
     * 资源不存在响应
     */
    public static <T> Result<T> notFound(String message) {
        return error(NOT_FOUND_CODE, message != null ? message : "资源不存在");
    }
    
    /**
     * 判断是否成功
     */
    public boolean isSuccess() {
        return Integer.valueOf(SUCCESS_CODE).equals(this.code) && Boolean.TRUE.equals(this.success);
    }
    
    /**
     * 判断是否失败
     */
    public boolean isError() {
        return !isSuccess();
    }
}